/**
 * @file 标签页存储操作工具
 * @description 提供统一的标签页 localStorage 存储操作
 * @author 黄敏
 * @version 1.0.0
 * @since 2025-08-22
 */

// localStorage 键名常量
export const STORAGE_KEYS = {
  LEFT_SIDEBAR: 'leftTabs-v2',
  RIGHT_SIDEBAR: 'rightTabs-v2'
} as const

/**
 * TODO 删除原本地存储的标签页数据, 上线前删除
 * */
localStorage.removeItem('leftTabs')
localStorage.removeItem('rightTabs')

export type StorageKey = (typeof STORAGE_KEYS)[keyof typeof STORAGE_KEYS]

/**
 * 从 localStorage 加载边栏标签页
 * @param key 存储键名
 * @returns 边栏标签页数组
 */
export function loadTabsFromStorage(key: StorageKey): F2.tab.PersistData[] | undefined {
  try {
    const stored = localStorage.getItem(key)
    if (!stored) return void 0
    return JSON.parse(stored)
  } catch (error) {
    console.error('加载边栏标签页失败:', error)
    return void 0
  }
}

/**
 * 保存边栏标签页到 localStorage
 * 只保存必要的持久化字段
 * @param sidebarTabs 边栏标签页数组
 * @param key 存储键名
 */
export function saveTabsToStorage(sidebarTabs: F2.tab.Sidebar[], key: StorageKey): void {
  try {
    const persistData: F2.tab.PersistData[] = sidebarTabs.map(tab => tab.origin)
    localStorage.setItem(key, JSON.stringify(persistData))
    console.log('保存边栏标签页成功:', key)
  } catch (error) {
    console.error('保存边栏标签页失败:', error)
  }
}

/**
 * 更新边栏标签页数据的通用方法
 * @param sidebarTabs 边栏标签页数组
 * @param updatedTab 更新的标签页数组
 * @param storageKey 存储键名
 * @returns 是否有更新,这里的更新是指是否存在更新的标签页
 */
export function updateSidebarTabs(
  sidebarTabs: F2.tab.Sidebar[],
  updatedTab: F2.tab.Patch,
  storageKey: StorageKey
) {
  let hasUpdate = false

  const fields = [
    'sidebarConfig',
    'separateConfig',
    'isMobile',
    'isInSeparateWindow',
    'autoOpenOnStartup'
  ] as const

  const sidebarTab = sidebarTabs.find(v => v.origin.id === updatedTab.id)

  if (!sidebarTab) return false

  // 查找更新的标签页，只更新匹配的标签页，否则不处理
  if (sidebarTab.data) {
    let needsSave = false

    for (const field of fields) {
      if (updatedTab[field] === undefined) continue
      if (updatedTab[field] !== sidebarTab.origin[field]) {
        // @ts-expect-error
        sidebarTab.origin[field] = updatedTab[field]
        needsSave = true
      }
    }

    if (needsSave) {
      hasUpdate = true
    }
    // 更新完整的标签页对象
    Object.assign(sidebarTab.data, updatedTab)
  }

  // 批量保存，避免频繁写入
  if (hasUpdate) {
    saveTabsToStorage(sidebarTabs, storageKey)
  }
  return true
}
